package com.powernode.bank.service.Impl;

import com.powernode.bank.dao.AccountDao;
import com.powernode.bank.dao.Impl.AccountDaoImpl;
import com.powernode.bank.execption.FailTransferExecption;
import com.powernode.bank.execption.MoneyNotEnoughExecption;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import com.powernode.bank.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;

public class AccountServiceImpl implements AccountService {
    //放到成员变量中，下面的方法都可以使用
    //private AccountDao accountDao = new AccountDaoImpl();

    // 在mybatis当中，mybatis提供了相关的机制。也可以动态为我们生成dao接口的实现类（代理类：dao接口的代理）
    // mybatis当中实际上采用了代理模式。在内存中生成dao接口的代理类，然后创建代理类的实例
    // 使用mybatis这种代理机制的前提：SqlMapper.xml文件中namespace必须是dao接口的全限定名称，id必须是dao接口的方法名
    // 怎么用？代码怎么写？AccountDao accountDao = SqlSession.getMapper(AccountDao.class);

    private AccountDao accountDao = SqlSessionUtils.openSession().getMapper(AccountDao.class);

    /**
     * 转账
     * @param fromAct 转出账户
     * @param toAct 转入账户
     * @param money 转出金额
     */
    @Override
    public void transfer(String fromAct, String toAct, double money) throws MoneyNotEnoughExecption, FailTransferExecption {
        // 添加事务控制代码
        SqlSession sqlSession = SqlSessionUtils.openSession();

        // 1.判断钱是否充足
        Account fromAccount = accountDao.selectByActNo(fromAct);
        if(fromAccount.getBalance() < money){
            // 2.不充足就报错
            throw new MoneyNotEnoughExecption("转账失败，余额不足！！！");
        }
        // 代码执行到这表示余额是充足的
        // 3.修改对象中的钱
        Account toAccount = accountDao.selectByActNo(toAct);
        fromAccount.setBalance(fromAccount.getBalance() - money);
        toAccount.setBalance(toAccount.getBalance() + money);
        // 4.连接数据库进行真正的修改
        int count = accountDao.updateByAccount(fromAccount);

        // 模拟异常
        String s = null;
        s.toString();

        count += accountDao.updateByAccount(toAccount);
        // 5.对count进行判断
        if(count != 2){
            throw new FailTransferExecption("转账失败，原因未知！！！");
        }

        //提交事务
        sqlSession.commit();
        //关闭事务
        SqlSessionUtils.close(sqlSession);
    }
}
